package com.test19_多线程;

/**
 * 1、进程：
 * 进程是资源（CPU、内存等）分配的基本单位，它是程序执行时的一个实例。
 * 程序运行时系统就会创建一个进程，并为它分配资源，然后把该进程放入进程就绪队列，
 * 进程调度器选中它的时候就会为它分配CPU时间，程序开始真正运行。
 * 2、线程：
 * 线程是程序执行时的最小单位，它是进程的一个执行流，是CPU调度和分派的基本单位。
 * 一个进程可以由很多个线程组成，线程间共享进程的所有资源，每个线程有自己的堆栈和局部变量。
 * 线程由CPU独立调度执行，在多CPU环境下就允许多个线程同时运行。同样多线程也可以实现并发操作，每个请求分配一个线程来处理。
 */
public class Demo01_Thread {

    public static void main(String[] args) {
//        test1();
//        test2();
        test3();
    }

    /**
     * 错误的多线程执行
     */
    public static void test1() {
        MyThread threadA = new MyThread("Yootk-A线程");
        MyThread threadB = new MyThread("Yootk-B线程");
        MyThread threadC = new MyThread("Yootk-C线程");
        threadA.run();  // 运行线程的主方法
        threadB.run();
        threadC.run();
    }

    /**
     * 正确的进行多线程的启动
     */
    public static void test2() {
        MyThread threadA = new MyThread("Yootk-A线程");
        MyThread threadB = new MyThread("Yootk-B线程");
        MyThread threadC = new MyThread("Yootk-C线程");
        threadA.start();    // 启动线程并调用run()方法
        threadB.start();
        threadC.start();
    }

    /**
     * 每个线程只能启动一次
     * 否则抛出IllegalThreadStateException异常
     */
    public static void test3() {
        MyThread thread = new MyThread("Yootk线程");
        thread.start();     // 启动线程并调用run()方法
        thread.start();     // 启动线程并调用run()方法
    }
}

/** 定义线程主体类 */
class MyThread extends Thread {
    private String name;

    public MyThread(String name) {
        this.name = name;
    }

    /** 线程运行的主方法 */
    @Override
    public void run() {
        for (int x = 0; x < 10; x++) {
            System.out.println("【" + this.name + "】线程执行，当前的循环次数为：x = " + x);
        }
    }
}
